package user

import (
	"net/http"
	"strings"

	"github.com/micro-plat/hydra"
	"github.com/micro-plat/lib4go/errs"
	"github.com/micro-plat/lib4go/security/md5"
)

//UnlockHandle  解锁用户系统角色信息
func (u *UserInfoHandler) UnlockHandle(ctx hydra.IContext) (r interface{}) {
	ctx.Log().Info("--------重置用户密码数据--------")

	ctx.Log().Info("1.检查必须字段")
	if err := ctx.Request().Check("user_id"); err != nil {
		return err
	}

	ctx.Log().Info("2.重置用户错误次数")
	i, err := hydra.C.DB().GetRegularDB().Execute(unlockUserByUserID, map[string]interface{}{
		"user_id": ctx.Request().GetString("user_id"),
	})
	if err != nil || i < 0 {
		return errs.NewErrorf(http.StatusNotExtended, "重置用户错误次数:%+v", errs.GetDBError(i, err))
	}
	return "success"
}

//QueryRoleListHandle  查询用户系统角色信息
func (u *UserInfoHandler) ResetHandle(ctx hydra.IContext) (r interface{}) {
	ctx.Log().Info("--------重置用户密码数据--------")

	ctx.Log().Info("1.检查必须字段")
	if err := ctx.Request().Check("user_id"); err != nil {
		return err
	}

	ctx.Log().Info("2.重置用户密码")
	npwd := md5.Encrypt("1qaz2wsx")
	i, err := hydra.C.DB().GetRegularDB().Execute(resetPasswordByUserID, map[string]interface{}{
		"user_id":  ctx.Request().GetString("user_id"),
		"password": npwd,
	})
	if err != nil || i < 0 {
		return errs.NewErrorf(http.StatusNotExtended, "重置用户密码出错:%+v", errs.GetDBError(i, err))
	}
	return "success"
}

//QueryRoleListHandle  查询用户系统角色信息
func (u *UserInfoHandler) QueryRoleListHandle(ctx hydra.IContext) (r interface{}) {

	ctx.Log().Info("--------查询用户系统角色数据--------")

	ctx.Log().Info("1.检查必须字段")
	if err := ctx.Request().Check("user_id"); err != nil {
		return err
	}

	ctx.Log().Info("2.查询数据")
	data, err := hydra.C.DB().GetRegularDB().Query(queryUserSystemRoles, ctx.Request().GetMap())
	if err != nil {
		return errs.NewErrorf(http.StatusNotExtended, "查询数据出错:%+v", err)
	}
	return data
}

//SaveSysRoleHandle  保存用户系统角色信息
func (u *UserInfoHandler) SaveSysRoleHandle(ctx hydra.IContext) (r interface{}) {

	ctx.Log().Info("--------保存用户系统角色数据--------")

	ctx.Log().Info("1.检查必须字段")
	if err := ctx.Request().Check("user_id"); err != nil {
		return err
	}

	ctx.Log().Info("2.批量删除数据")
	xdb, err := hydra.C.DB().GetRegularDB().Begin()
	if err != nil {
		return err
	}
	_, err = xdb.Execute(deleteSysRoleByUserID, map[string]interface{}{
		"user_id": ctx.Request().GetString("user_id"),
	})
	if err != nil {
		xdb.Rollback()
		return errs.NewErrorf(999, "删除用户系统角色失败：%w", err)
	}
	if ctx.Request().GetString("sysids") == "" && ctx.Request().GetString("roleids") == "" {
		xdb.Commit()
		return "success"
	}
	ctx.Log().Info("3.批量添加数据")
	sysidlist := strings.Split(ctx.Request().GetString("sysids"), ",")
	roleidlist := strings.Split(ctx.Request().GetString("roleids"), ",")
	if len(sysidlist) != len(roleidlist) {
		return errs.NewErrorf(998, "删除用户系统角色失败：传入系统编号与角色编号个数不匹配%v(%v)", sysidlist, roleidlist)
	}

	for i, v := range sysidlist {
		i, err := xdb.Execute(insertSysRoleByUserID, map[string]interface{}{
			"role_id": roleidlist[i],
			"sys_id":  v,
			"user_id": ctx.Request().GetString("user_id"),
		})
		if err != nil || i == 0 {
			xdb.Rollback()
			return errs.NewErrorf(999, "添加角色菜单失败：%w", errs.GetDBError(i, err))
		}
	}
	xdb.Commit()

	return "success"
}
